"""
与文件处理相关的类定义
内容：
先定义一个抽象类来做顶层设计，
依据这个类做不同文本类型的读取器
"""
from data_define import Record
import json


# 1.定义一个抽象类，规定所有文件读取器都需要遵守的统一规则
class FileReader:
    def read_data(self) -> list[Record]:
        """读取文件的数据，将每一行数据都转化为Record对象，以列表的形式返回"""
        pass

# 2.text版文件读取器
class TextFileReader(FileReader):

    ## 定义成员变量：记录文件路径
    def __init__(self, path):
        self.path = path

    ## 复写抽象类(记得先继承才能复写)
    def read_data(self) -> list[Record]:

        ### 打开文件
        f = open(self.path, "r", encoding="UTF-8")

        ### 创建空列表用于存储待会整理好的数据
        record_list:list[Record] = []

        ### 循环处理每一行的数据
        lines = f.readlines()
        for line in lines:
            line = line.strip()            # 去除空格
            data_list = line.split(",")    # 以逗号为界分割
            record = Record(data_list[0], data_list[1], data_list[2], data_list[3])   # 基于数据类创建对象（每一行都是一个对象）
            record_list.append(record)     # 将对象都封装进列表里

        ### 关闭文件，返回整理好的数据列表
        f.close()
        return record_list


# 3.JSON版文件读取器
class JsonFileReader(FileReader):

    # 创建成员变量：记录文件路径
    def __init__(self, path):
        self.path = path

    # 复写
    def read_data(self) -> list[Record]:

        # 打开文件
        f = open(self.path, "r", encoding="utf-8")

        # 转格式
        ## 数据很少的时候可以先整体转格式，但是数据很多的时候整体转就很会吃力，
        ## 所以我们会选择再循环里面遇到一个就转一个的格式

        # 创建空列表
        record_list: list[Record] = []

        # 循环处理数据，封装成一个个列表对象
        lines = f.readlines()
        for line in lines:
            # 转格式为字典
            data_dic = json.loads(line)
            record = Record(data_dic["date"], data_dic["order_id"], data_dic["money"], data_dic["province"])
            record_list.append(record)

        # 处理结束，关闭文件，返回结果列表
        f.close()
        return record_list


# 4.开始实践一下
if __name__ == '__main__':

    # 记住python里面的函数都是在类里面的，使用类之前一定要记得先创建对象
    text_file_reader = TextFileReader(r"C:\Users\Lenovo\OneDrive\桌面\2011年1月销售数据.txt")
    json_file_reader = JsonFileReader(r"C:\Users\Lenovo\OneDrive\桌面\2011年2月销售数据JSON.txt")

    # 创建对象之后，使用类里面的方法
    list1 = text_file_reader.read_data()
    list2 = json_file_reader.read_data()

    # 打印结果（整理好的每一行数据）出来看看
    for i in list1:
        print(i)

    for i in list2:
        print(i)
